﻿#ifndef IMGSPEC_H
#define IMGSPEC_H

#include <Eigen/Sparse>
#include <opencv2/core/eigen.hpp>
#include <opencv2/opencv.hpp>

#include <vector>

// 定义边的结构体
struct Edge {
    int v;
    double weight;
    Edge(int _v, double _weight) : v(_v), weight(_weight) {}
};

// 图像处理器类
class ImageProcessor {
public:
    // 下采样图像
    static cv::Mat downSampleImage(const std::string& imagePath, const int kernel);
    // 构建相似度图
    static Eigen::SparseMatrix<double> Laplacian_mat(const cv::Mat& inimg,  const int rate);
    // 计算菲德勒向量
    static Eigen::VectorXd computeSpecVector(Eigen::SparseMatrix<double>& L,int k);
    // 谱聚类
    static void spectralClustering(Eigen::VectorXd& vec, const cv::Mat& img,
        cv::Mat& output);

    static cv::Mat visualizeSpecVector(const Eigen::VectorXd& Spec, const cv::Mat& img);

    static Eigen::VectorXd denoiseSpecVector(const Eigen::VectorXd& Spec, const cv::Mat& img, int kernelSize);
};

const int KNN = false;
#endif // IMGSPEC_H